package com.example.spring.activemq.jms.mq;

import com.example.spring.activemq.jms.constant.QueueConstant;
import com.example.spring.activemq.jms.utils.FastJsonUtils;
import com.example.spring.activemq.jms.vo.MQRestRstDta;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.util.UUID;

/**
 * 发送订单履历到mq
 */
@Slf4j
@Component
@Scope("prototype")
public class OperationProduct implements RabbitTemplate.ConfirmCallback {

    @Autowired
    private RabbitTemplate rabbitTemplate;

//    @Autowired
//    private RedisSelfService redisSelfService;

    /* 重发限制次数 */
    private static final Integer RETRY_LIMIT = 3;

    /**
     * 发送失败数据，放入缓存，需要接收该数据的服务自行从缓存取出数据，保存到数据库即可
     *
     * @param correlationData
     * @param ack
     * @param cause
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {

        /* 消息唯一标识ID，第一次发送时生成，失败重发时重用 */
        String id = correlationData.getId();
        log.info("消息ID：" + id + "，发送结果：" + ack + "，原因：" + cause);

        /* 发送成功，删除消息缓存 */
        if (ack) {
//            this.redisSelfService.delHashValKey(QueueConstant.RESUME_KEY, id);
        }
        /* 发送失败 */
        else {
//            String value = this.redisSelfService.getHashValStr(QueueConstant.RESUME_KEY, id);
//            MQRestRstDta<String> mqRestRstDta = FastJsonUtils.jsonToBean(value, MQRestRstDta.class);
//            /* 达到重发限制次数，直接返回，数据仍在redis中，定时任务解析 */
//            if (mqRestRstDta.getCount() == RETRY_LIMIT) {
//                return;
//            }
//            /* 增加重发次数 */
//            mqRestRstDta.setCount(mqRestRstDta.getCount() + 1);
//            this.redisSelfService.setHashValKey(QueueConstant.RESUME_KEY, id, FastJsonUtils.toJson(mqRestRstDta));
            /* 缓存修改完毕，重发消息 */
//            retrySend(id, mqRestRstDta.getResult());
        }
    }


    /* 重发消息 */
    private void retrySend(String id, String data) {
        CorrelationData correlationData = new CorrelationData(id);
        /* 订单状态数据 */
        this.rabbitTemplate.convertAndSend(QueueConstant.RESUME_EXCHANGE, QueueConstant.RESUME_KEY, data, correlationData);
    }

    /**
     * 发送消息到mq
     *
     * @param msg
     */
    public void sendMsgToMQ(String msg) {

        String messageId = UUID.randomUUID().toString().replace("-", "");
        CorrelationData correlation = new CorrelationData(messageId);
        log.debug(" >>>>>>>>>>>>>>>> 发送消息 Start >>>>>>>>>>>>>>>> ");
        log.debug("消息id : " + correlation);
        log.debug("消息内容 : " + msg);

        try {
            String json = FastJsonUtils.toJson(new MQRestRstDta<>(0, msg));
//            this.redisSelfService.setHashValKey(QueueConstant.RESUME_KEY, messageId, json);

            //设置回调函数
            rabbitTemplate.setConfirmCallback(this);
            //发送消息
            rabbitTemplate.convertAndSend(QueueConstant.RESUME_EXCHANGE, QueueConstant.RESUME_KEY, msg, correlation);
        } catch (AmqpException e) {
            e.printStackTrace();
            log.error("[ 订单状态更新，发送操作履历失败 : {} ]", e);
        }
        log.debug(" >>>>>>>>>>>>>>>> 发送消息 End >>>>>>>>>>>>>>>> ");
    }
}
